/*******************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.        */
/*                                                                 */
/*  NAME      = activemq_common.c                                  */
/*  NOTE      =                                                    */
/*  DATE      = 2015/04/28 by geyh                                 */
/*******************************************************************/

#include <stdio.h>
#include <stdlib.h>

#include "frcomm.h"
#include "frmem.h"
#include "activemq_common.h"
#include "activemq_core.h"
#include "frsoap_parse.h"
#include "frreport_comm.h"


//#define MQ_PUB                      APM_REPORT_KEY_PUB".mq"
//#define MQ_PUB_QUE                  MQ_PUB".queue"
//#define MQ_PUB_MSG_TYPE             MQ_PUB".message.type.1"
//#define MQ_PUB_MSG                  MQ_PUB".message"
//#define MQ_PUB_MSG_BIN              MQ_PUB_MSG".binary.1"
//#define MQ_PUB_MSG_TEXT             MQ_PUB_MSG".text.1"
//#define MQ_PUB_MSG_MAP              MQ_PUB_MSG".map.1"

#define MQ_REQ                      APM_REPORT_KEY_REQ".mq"
#define MQ_REQ_QUE                  MQ_REQ".queue"
#define MQ_REQ_TOPIC                MQ_REQ".topic"
#define MQ_REQ_MSG_TYPE             MQ_REQ".message.type"
#define MQ_REQ_METHOD               MQ_REQ".method"
#define MQ_REQ_MSG                  MQ_REQ".message"
#define MQ_REQ_MSG_BIN              MQ_REQ_MSG".binary"
#define MQ_REQ_MSG_TEXT             MQ_REQ_MSG".text"
#define MQ_REQ_MSG_MAP              MQ_REQ_MSG".map"


#define MQ_SUB                      APM_REPORT_KEY_SUB".mq"
#define MQ_SUB_QUE                  MQ_SUB".topic"


#define MQ_NOTIFY                   APM_REPORT_KEY_NOTIFY".mq"
#define MQ_NOTIFY_QUE               MQ_NOTIFY".queue"
#define MQ_NOTIFY_TOPIC             MQ_NOTIFY".topic"
#define MQ_NOTIFY_MSG_TYPE          MQ_NOTIFY".message.type.1"
#define MQ_NOTIFY_MSG               MQ_NOTIFY".message"
#define MQ_NOTIFY_MSG_BIN           MQ_NOTIFY_MSG".binary.1"
#define MQ_NOTIFY_MSG_TEXT          MQ_NOTIFY_MSG".text.1"
#define MQ_NOTIFY_MSG_MAP           MQ_NOTIFY_MSG".map.1"
#define MQ_NOTIFY_MSG_SIZE          MQ_NOTIFY_MSG".size"

//#define MQ_RESP                     APM_REPORT_KEY_RESP".mq"
//#define MQ_RESP_MSG_TYPE            MQ_RESP".message.type.1"
//#define MQ_RESP_METHOD              MQ_RESP".method.1"
//#define MQ_RESP_MSG                 MQ_RESP".message"
//#define MQ_RESP_MSG_BIN             MQ_RESP_MSG".binary.1"
//#define MQ_RESP_MSG_TEXT            MQ_RESP_MSG".text.1"
//#define MQ_RESP_MSG_MAP             MQ_RESP_MSG".map.1"




union int64_double_bits {
    int64_t int_bits;
    double double_bits;
};

union int32_float_bits {
    int32_t int_bits;
    float float_bits;
};




/*******************************************************************************
*  FUNC     :  map message 解析上报
*  ARGS     :  p_st_data                   输入数据包数据
*           :  p_st_body_data              上报链表
*           :  p_st_private                私有数据
*           :  p_i_msg_limit               最大长度
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     成功
*  NOTE     :
*******************************************************************************/
FR_STATIC int __map_message_report(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, L7session_activeMQ_private *p_st_private, int i_msg_limit)
{
    int i_ret = 0;
    unsigned short us_data_len = 0;
    char c_type;
    char arr_tmp[256];
    char *p_key_tag = NULL;
    //string
    char *p_field_value = NULL;

    union int64_double_bits u_64bits;
    uint64_t u64_len = 0;
    double db_value = 0.0;

    union int32_float_bits u_32bits;
    uint32_t u32_len = 0;
    float fl_value = 0.0;

    long long ll_value = 0;

    int i_value = 0;
    char arr_value[2];

    if(p_st_data == NULL || p_st_body_data == NULL || p_st_private == NULL)
        return FR_FAIL;

    i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    p_key_tag = (char *)frmalloc(us_data_len + 1);
    if(p_key_tag == NULL)
        return FR_FAIL;

    i_ret = bytebuff_get_bytes(p_st_data, p_key_tag, us_data_len);
    if(i_ret == FR_FAIL)
    {
        frfree(p_key_tag);
        return FR_FAIL;
    }

    p_key_tag[us_data_len] = '\0';


    if(p_st_private->i_use_request)
    {
        snprintf(arr_tmp, sizeof(arr_tmp), "%s.%s", MQ_REQ_MSG_MAP, p_key_tag);
    }
    else
    {
        snprintf(arr_tmp, sizeof(arr_tmp), "%s.%s", MQ_NOTIFY_MSG_MAP, p_key_tag);
    }


    frfree(p_key_tag);

    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&c_type);
    if(i_ret == FR_FAIL)
        return FR_FAIL;


    switch(c_type)
    {
        case '\x09':
            i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            p_field_value = (char *)frmalloc(us_data_len + 1);
            if(p_field_value == NULL)
                return FR_FAIL;

            i_ret = bytebuff_get_bytes(p_st_data, p_field_value, us_data_len);
            if(i_ret == FR_FAIL)
            {
                frfree(p_field_value);
                return FR_FAIL;
            }

            p_field_value[us_data_len] = '\0';

            i_ret = frreport_body_l7_add_str_limit(p_st_body_data, arr_tmp, p_field_value, i_msg_limit);
            frfree(p_field_value);

            break;

        case '\x08':
            i_ret = bytebuff_get_int(p_st_data, 4, &u32_len, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            u_32bits.int_bits = u32_len;
            fl_value = u_32bits.float_bits;

            i_ret = frreport_body_l7_add_float(p_st_body_data, arr_tmp, fl_value);

            break;

        case '\x07':
            i_ret = bytebuff_get_long(p_st_data, 8, &u64_len, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            u_64bits.int_bits = u64_len;
            db_value = u_64bits.double_bits;

            i_ret = frreport_body_l7_add_double(p_st_body_data, arr_tmp, db_value);

            break;

        case '\x06':
            i_ret = bytebuff_get_long(p_st_data, 8, (uint64_t *)&ll_value, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            i_ret = frreport_body_l7_add_long(p_st_body_data, arr_tmp, ll_value);

            break;

        case '\x05':
            i_ret = bytebuff_get_int(p_st_data, 4, (uint32_t *)&i_value, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            i_ret = frreport_body_l7_add_int(p_st_body_data, arr_tmp, i_value);

            break;

        case '\x04':
            i_ret = bytebuff_get_int(p_st_data, 2, (uint32_t *)&i_value, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            i_ret = frreport_body_l7_add_int(p_st_body_data, arr_tmp, i_value);

            break;

        case '\x03':
        case '\x02':
            i_ret = bytebuff_get_char(p_st_data, (uint8_t *)arr_value);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
            arr_value[1]= '\0';

            i_ret = frreport_body_l7_add_str(p_st_body_data, arr_tmp, arr_value);

            break;
        case '\x01':
            i_ret = bytebuff_get_char(p_st_data, (uint8_t *)arr_value);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            if(arr_value[0] == '\x00')
                i_ret = frreport_body_l7_add_str(p_st_body_data, arr_tmp, "false");
            else
                i_ret = frreport_body_l7_add_str(p_st_body_data, arr_tmp, "true");

            break;

        case '\x00':
            i_ret = frreport_body_l7_add_str(p_st_body_data, arr_tmp, "null");
            break;

        default:
            return FR_FAIL;

    }

    return i_ret;

}

/*******************************************************************************
*  FUNC     :  session信息获取(title)
*  ARGS     :  p_st_data                   输入数据包数据
*           :  p_st_body_data              上报链表
*           :  p_st_private                私有数据
*           :  p_i_msg_limit               最大长度
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     成功
*  NOTE     :
*******************************************************************************/
FR_STATIC int __get_session_info(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean
                                , Frreport_body_data *p_st_body_data, char **pp_out)
{
    int i_ret = 0;
    unsigned short us_data_len = 0;
    char *p_field_value = NULL;

    if(p_st_data == NULL || p_st_body_data == NULL || pp_out == NULL)
        return FR_FAIL;

    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        goto ERROR;

    if(i_ret)
    {
        if(p_st_boolean)
        {
            // is assic only
            i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
            if(i_ret < 0)
                goto ERROR;

            if(i_ret)
            {
                //取得长度
                i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
                if(i_ret == FR_FAIL)
                    goto ERROR;

                p_field_value = (char *)frmalloc(us_data_len + 1);
                if(p_field_value == NULL)
                    goto ERROR;

                i_ret = bytebuff_get_bytes(p_st_data, p_field_value, us_data_len);
                if(i_ret == FR_FAIL)
                    goto ERROR;
                p_field_value[us_data_len] = '\0';
            }
            else
            {
                //取得长度
                i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
                if(i_ret == FR_FAIL)
                    goto ERROR;

                p_field_value = (char *)frmalloc(us_data_len + 1);
                if(p_field_value == NULL)
                    goto ERROR;

                i_ret = bytebuff_get_bytes(p_st_data, p_field_value + 4, us_data_len);
                if(i_ret == FR_FAIL)
                    goto ERROR;
                
                p_field_value[us_data_len] = '\0';
            }
        }
        else
        {
            //取得长度
            i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                goto ERROR;

            p_field_value = (char *)frmalloc(us_data_len + 1);
            if(p_field_value == NULL)
                goto ERROR;

            i_ret = bytebuff_get_bytes(p_st_data, p_field_value, us_data_len);
            if(i_ret == FR_FAIL)
                goto ERROR;

            p_field_value[us_data_len] = '\0';
        }
    
        if(*pp_out)
            frfree(*pp_out);
        
        *pp_out = p_field_value;
        return FR_SUCC;
    }

    return FR_SUCC;

ERROR:
    *pp_out = NULL;

    if(p_field_value)
        frfree(p_field_value);

    return FR_FAIL;
}


/*
*  activemq 字段名重组
*/

FR_STATIC int __activemq_fieldname_restruct(const char *p_src, char *p_dst, int i_out_len, int i_use_request, int is_topic)
{
    if(p_src == NULL || p_dst == NULL)
        return FR_FAIL;

    if(i_use_request == FR_YES)
        snprintf(p_dst, i_out_len, "request.mq.%s", p_src);
    else
        snprintf(p_dst, i_out_len, "notify.mq.%s", p_src);


    return FR_SUCC;
}


/*******************************************************************************
*  FUNC     :  java中布尔型字符串获取
*  ARGS     :  p_st_data                   输入数据包数据
*           :  pp_st_boolean               输出boolean数据
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     成功
*  NOTE     :
*******************************************************************************/
int activeMQ_boolean_stream_get(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean **pp_st_boolean, L7session_activeMQ_private *p_st_private)
{
    ACTIVEMQ_boolean *p_st_boolean = NULL;
    unsigned char uc_tmp = 0x00;
    unsigned int ui_pos = 0;
    unsigned short us_boolean_data_len = 0;
    char *p_boolean_data = NULL;
    int i_ret = 0;

    if(p_st_data == NULL || pp_st_boolean == NULL)
        return FR_FAIL;
        
    if(p_st_private->i_tightEncodingEnabled == 0)
        return FR_SUCC;

    //获取第一位标志位或长度
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //p_st_boolean
    p_st_boolean = (ACTIVEMQ_boolean*)frmalloc(sizeof(ACTIVEMQ_boolean));
    if(p_st_boolean == NULL)
        return FR_FAIL;

    memset(p_st_boolean, 0x00, sizeof(ACTIVEMQ_boolean));

    if((unsigned char)(uc_tmp & 0xff) == 0)
    {
        *pp_st_boolean = p_st_boolean;
        return FR_SUCC;
    }
    else if((unsigned char)(uc_tmp & 0xc0) == 0)
    {
        us_boolean_data_len = 0xff & uc_tmp;
    }
    else if((unsigned char)(uc_tmp & 0x80) == 0)
    {
        i_ret = bytebuff_get_short(p_st_data, 1, &us_boolean_data_len, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
        {
            frfree(p_st_boolean);
            return FR_FAIL;
        }
    }
    else
    {
        i_ret = bytebuff_get_short(p_st_data, 2, &us_boolean_data_len, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
        {
            frfree(p_st_boolean);
            return FR_FAIL;
        }
    }

    ui_pos = bytebuff_getPosition(p_st_data);
    p_boolean_data = (char *)frmalloc(us_boolean_data_len + 1);
    if(p_boolean_data == NULL)
    {
        frfree(p_st_boolean);
        return FR_FAIL;
    }

    i_ret = bytebuff_get_bytes(p_st_data, p_boolean_data, us_boolean_data_len);
    if(i_ret == FR_FAIL )
    {
        frfree(p_st_boolean);
        frfree(p_boolean_data);
        return FR_FAIL;
    }
    p_boolean_data[us_boolean_data_len] = '\0';

    //出力设置
    p_st_boolean->p_boolean_data = p_boolean_data;
    p_st_boolean->us_arraylimit = us_boolean_data_len;
    *pp_st_boolean = p_st_boolean;

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  java中布尔型字符串解析
*  ARGS     :  p_st_boolean               输入的布尔型字符串
*  RTN      :  -1                          失败
*           :  0                           false
*           :  1                           true
*  NOTE     :
*******************************************************************************/
FR_STATIC int activeMQ_boolean_stream_parse1(ACTIVEMQ_boolean *p_st_boolean)
{
    int i_ret = 0;
    unsigned char uc_tmp;
    char *p_booleanstream = NULL;

    if(p_st_boolean == NULL || p_st_boolean->p_boolean_data == NULL)
        return -1;

    if(p_st_boolean->us_arraypos >= p_st_boolean->us_arraylimit || p_st_boolean->us_bytepos >= 8)
        return -1;

    //获取布尔型的值
    p_booleanstream = p_st_boolean->p_boolean_data;
    uc_tmp = (unsigned char)(*(p_booleanstream + p_st_boolean->us_arraypos));
    if( 0x01 & (uc_tmp >> p_st_boolean->us_bytepos))
        i_ret = 1;

    //指向下一个bit
    p_st_boolean->us_bytepos++;
    if(p_st_boolean->us_bytepos == 8)
    {
        p_st_boolean->us_arraypos ++;
        p_st_boolean->us_bytepos = 0;
    }
    return i_ret;
}


/*******************************************************************************
*  FUNC     :  java中布尔型字符串解析 loosemarshal
*  ARGS     :  p_st_boolean               输入的布尔型字符串
*  RTN      :  -1                          失败
*           :  0                           false
*           :  1                           true
*  NOTE     :
*******************************************************************************/
FR_STATIC int activeMQ_boolean_stream_parse2(Frbyte_Packet *p_st_data)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL)
        return -1;

    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL)
        return -1;

    if(uc_tmp == 1)
        i_ret = 1;
    else if(uc_tmp == 0)
        i_ret = 0;
    else
        return -1;

    return i_ret;
}

/*******************************************************************************
*  FUNC     :  java中布尔型字符串解析
*  ARGS     :  p_st_boolean               输入的布尔型字符串
*  RTN      :  -1                          失败
*           :  0                           false
*           :  1                           true
*  NOTE     :
*******************************************************************************/
int activeMQ_boolean_stream_parse(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean)
{
    int i_ret = 0;

    if(p_st_boolean)
        i_ret = activeMQ_boolean_stream_parse1(p_st_boolean);
    else if(p_st_data)
        i_ret = activeMQ_boolean_stream_parse2(p_st_data);
    else
        i_ret = -1;

    return i_ret;
}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取ACTIVEMQ的数据，不包含长度，并且返回类型
*  ARGS     :  p_st_data                   输入力数据
*           :  pp_output                   输出数据内容
*           :  p_i_data_type               保存在Frdata_field 中的数据类型
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_get_data(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, const char *p_field_name, int *p_i_value)
{
    unsigned char type = 0x00;
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL || p_field_name == NULL)
        return FR_FAIL;

    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&type);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    switch(type)
    {
        case ACTIVEMQ_DATA_NULL:
            return FR_SUCC;

        case ACTIVEMQ_DATA_BOOLEAN:
        {
            //取值，指针后移一位
            i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            if(uc_tmp == 0x01)
            {
//                i_ret = frreport_body_l7_add_int(p_st_body_data, p_field_name, 1);
                *p_i_value = 1;
            }
            else
            {
//                i_ret = frreport_body_l7_add_int(p_st_body_data, p_field_name, 0);
                *p_i_value = 0;
            }
            break;
        }
        case ACTIVEMQ_DATA_BYTE:
        case ACTIVEMQ_DATA_CHAR:
        {
//            p_field_value = frmalloc(2);
//            if(p_field_value == NULL)
//                return FR_FAIL;
//
//            i_ret = bytebuff_get_char(p_st_data, (uint8_t *)p_field_value);
//            if(i_ret == FR_FAIL)
//            {
//                frfree(p_field_value);
//                return FR_FAIL;
//            }
//            p_field_value[1] = '\0';
//            i_ret = frreport_body_l7_add_str(p_st_body_data, p_field_name, p_field_value);
//            frfree(p_field_value);
            i_ret = bytebuff_skip(p_st_data, 1);
            break;
        }
        case ACTIVEMQ_DATA_SHORT:
        {
//            unsigned short us_value = 0;
//
//            //取short
//            i_ret = bytebuff_get_short(p_st_data, 2, &us_value, BYTE_BIG_ENDIAN);
//            if(i_ret == FR_FAIL)
//                return FR_FAIL;

            //转化为字符串
//            i_ret = frreport_body_l7_add_int(p_st_body_data, p_field_name, us_value);
            i_ret = bytebuff_skip(p_st_data, 2);
            break;
        }
        case ACTIVEMQ_DATA_INTEGER:
        {
//            unsigned int ui_value = 0;
//
//            //取short
//            i_ret = bytebuff_get_int(p_st_data, 4, &ui_value, BYTE_BIG_ENDIAN);
//            if(i_ret == FR_FAIL)
//                return FR_FAIL;

            //转化为字符串
//            i_ret = frreport_body_l7_add_int(p_st_body_data, p_field_name, ui_value);
            i_ret = bytebuff_skip(p_st_data, 4);
            break;
        }

        case ACTIVEMQ_DATA_LONG:
        {
//            unsigned long long ull_value = 0;
//
//            //取short
//            i_ret = bytebuff_get_long(p_st_data, 8,(uint64_t *) &ull_value, BYTE_BIG_ENDIAN);
//            if(i_ret == FR_FAIL)
//                return FR_FAIL;
            i_ret = bytebuff_skip(p_st_data, 8);
            //转化为字符串
//            i_ret = frreport_body_l7_add_long(p_st_body_data, p_field_name, ull_value);
            break;
        }

        case ACTIVEMQ_DATA_STRING:
        {
            unsigned short us_data_len = 0;

            i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

//            p_field_value = frmalloc(us_data_len + 1);
//            if(p_field_value == NULL)
//                return FR_FAIL;
//            ui_pos = bytebuff_getPosition(p_st_data);
//
//            i_ret = bytebuff_get_bytes(p_st_data, p_field_value, us_data_len);
//            if(i_ret == FR_FAIL)
//            {
//                frfree(p_field_value);
//                return FR_FAIL;
//            }
//            p_field_value[us_data_len] = '\0';
//            i_ret = frreport_body_l7_add_str(p_st_body_data, p_field_name, p_field_value);
//            frfree(p_field_value);
            i_ret = bytebuff_skip(p_st_data, us_data_len);
            break;
        }
        default:
            return i_ret;
    }

    return FR_SUCC;

}


/*******************************************************************************
*  FUNC     :  从bytebuff中获取ACTIVEMQ的数据，已知所要获取数据的类型
*  ARGS     :  p_st_data                   输入力数据
*           :  pp_output                   输出数据内容
*           :  p_i_data_type               保存在Frdata_field 中的数据类型
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
//int activeMQ_get_data2(Frbyte_Packet *p_st_data, void **pp_output, int i_data_type)
//{
//    char *p_output = NULL;
//    int i_ret = 0;
//    unsigned int ui_pos = 0;
//
//    if(p_st_data == NULL || pp_output == NULL)
//        return FR_FAIL;
//
//    switch(i_data_type)
//    {
//        case ACTIVEMQ_DATA_NULL:
//        {
//            //取值，指针后移一位
//            p_output = NULL;
//            break;
//        }
//        case ACTIVEMQ_DATA_BOOLEAN:
//        {
//            //取值，指针后移一位
//            p_output = frmalloc(2);
//            if(p_output == NULL)
//                return FR_FAIL;
//
//            i_ret = bytebuff_get_char(p_st_data, (uint8_t *)p_output);
//            if(i_ret == FR_FAIL)
//            {
//                frfree(p_output);
//                return FR_FAIL;
//            }
//            if(*p_output == 0x01)
//                *p_output = '1';
//            else
//                *p_output = '0';
//            p_output[1] = '\0';
//
//            break;
//        }
//        case ACTIVEMQ_DATA_BYTE:
//        case ACTIVEMQ_DATA_CHAR:
//        {
//            p_output = frmalloc(2);
//            if(p_output == NULL)
//                return FR_FAIL;
//
//            i_ret = bytebuff_get_char(p_st_data, (uint8_t *)p_output);
//            if(i_ret == FR_FAIL)
//            {
//                frfree(p_output);
//                return FR_FAIL;
//            }
//            p_output[1] = '\0';
//
//            break;
//        }
//        case ACTIVEMQ_DATA_SHORT:
//        {
//            unsigned short us_value = 0;
//
//            //取short
//            i_ret = bytebuff_get_short(p_st_data, 2, &us_value, BYTE_BIG_ENDIAN);
//            if(i_ret == FR_FAIL)
//                return FR_FAIL;
//
//            //出力
//
//            *pp_output = &us_value;
//
//            return FR_SUCC;
//        }
//        case ACTIVEMQ_DATA_INTEGER:
//        {
//            unsigned int ui_value = 0;
//
//            //取short
//            i_ret = bytebuff_get_int(p_st_data, 4, &ui_value, BYTE_BIG_ENDIAN);
//            if(i_ret == FR_FAIL)
//                return FR_FAIL;
//
//            //出力
//            *pp_output = &ui_value;
//
//            return FR_SUCC;
//        }
//        case ACTIVEMQ_DATA_LONG:
//        {
//            unsigned long long ull_value = 0;
//
//            //取short
//            i_ret = bytebuff_get_long(p_st_data, 8,(uint64_t *) &ull_value, BYTE_BIG_ENDIAN);
//            if(i_ret == FR_FAIL)
//                return FR_FAIL;
//
//            //出力
//            *pp_output = &ull_value;
//
//            return FR_SUCC;
//        }
//        case ACTIVEMQ_DATA_STRING:
//        {
//            unsigned short us_data_len = 0;
//
//            i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
//            if(i_ret == FR_FAIL)
//                return FR_FAIL;
//
//            p_output = frmalloc(us_data_len + 1);
//            if(p_output == NULL)
//                return FR_FAIL;
//            ui_pos = bytebuff_getPosition(p_st_data);
//
//            i_ret = bytebuff_get_bytes(p_st_data, p_output, us_data_len);
//            if(i_ret == FR_FAIL)
//            {
//                frfree(p_output);
//                return FR_FAIL;
//            }
//            p_output[us_data_len] = '\0';
//
//            break;
//        }
//        default:
//            return FR_FAIL;
//    }
//
//    *pp_output = p_output;
//    return FR_SUCC;
//
//}


///*******************************************************************************
//*  FUNC     :  从bytebuff中获取string 添加到链表中
//*  ARGS     :  p_st_data                   输入力数据
//*           :  p_st_boolean                boolean stream
//*           :  p_st_body_data                上报链表
//*           :  p_field_name                上报string的字段名
//*  RTN      :  FR_FAIL                     失败
//*           :  FR_SUCC                     false
//*  NOTE     :
//*******************************************************************************/
//FR_STATIC int activeMQ_get_string1(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean
//                    , Frreport_body_data *p_st_body_data, const char *p_field_name, int i_use_request)
//{
//    char *p_field_value = NULL;
//    int i_ret = 0;
//    unsigned short us_data_len = 0;
//    char arr_tmp[256];
//
//    if(p_st_data == NULL || p_st_boolean == NULL
//        || p_st_body_data == NULL || p_field_name == NULL)
//        return FR_FAIL;
//
//    //!= NULL
//    i_ret = activeMQ_boolean_stream_parse1(p_st_boolean);
//    if(i_ret < 0)
//        return FR_FAIL;
//
//    if(i_ret)
//    {
//        // is assic only
//        i_ret = activeMQ_boolean_stream_parse1(p_st_boolean);
//        if(i_ret < 0)
//            return FR_FAIL;
//
//        if(i_ret)
//        {
//            //取得长度
//            i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
//            if(i_ret == FR_FAIL)
//                return FR_FAIL;
//
//            p_field_value = frmalloc(us_data_len + 1);
//            if(p_field_value == NULL)
//                return FR_FAIL;
//
//            i_ret = bytebuff_get_bytes(p_st_data, p_field_value, us_data_len);
//            if(i_ret == FR_FAIL)
//            {
//                frfree(p_field_value);
//                return FR_FAIL;
//            }
//            p_field_value[us_data_len] = '\0';
//        }
//        else
//        {
//            //取得长度
//            i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
//            if(i_ret == FR_FAIL)
//                return FR_FAIL;
//
//            p_field_value = frmalloc(us_data_len + 1);
//            if(p_field_value == NULL)
//                return FR_FAIL;
//
//            i_ret = bytebuff_get_bytes(p_st_data, p_field_value, us_data_len);
//            if(i_ret == FR_FAIL)
//            {
//                frfree(p_field_value);
//                return FR_FAIL;
//            }
//            p_field_value[us_data_len] = '\0';
//        }
//
//        i_ret = frreport_body_l7_add_str(p_st_body_data, arr_tmp, p_field_value);
//
//        frfree(p_field_value);
//        return i_ret;
//
//    }
//
//    return FR_SUCC;
//
//}
//
///*******************************************************************************
//*  FUNC     :  从bytebuff中获取string 添加到链表中
//*  ARGS     :  p_st_data                   输入力数据
//*           :  p_st_body_data                上报链表
//*           :  p_field_name                上报string的字段名
//*  RTN      :  FR_FAIL                     失败
//*           :  FR_SUCC                     false
//*  NOTE     :
//*******************************************************************************/
//FR_STATIC int activeMQ_get_string2(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, const char *p_field_name, int i_use_request)
//{
//    char *p_field_value = NULL;
//    int i_ret = 0;
//    unsigned short us_data_len = 0;
//    char arr_tmp[256];
//
//    if(p_st_data == NULL || p_st_body_data == NULL || p_field_name == NULL)
//        return FR_FAIL;
//
//    //!= NULL
//    i_ret = activeMQ_boolean_stream_parse2(p_st_data);
//    if(i_ret < 0)
//        return FR_FAIL;
//
//    if(i_ret)
//    {
//        //取得长度
//        i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
//        if(i_ret == FR_FAIL)
//            return FR_FAIL;
//
//        p_field_value = frmalloc(us_data_len + 1);
//        if(p_field_value == NULL)
//            return FR_FAIL;
//
//        i_ret = bytebuff_get_bytes(p_st_data, p_field_value, us_data_len);
//        if(i_ret == FR_FAIL)
//        {
//            frfree(p_field_value);
//            return FR_FAIL;
//        }
//        p_field_value[us_data_len] = '\0';
//
//        //分配内存
//        i_ret = frreport_body_l7_add_str(p_st_body_data, arr_tmp, p_field_value);
//
//        frfree(p_field_value);
//        return i_ret;
//
//    }
//
//    return FR_SUCC;
//
//}
//
///*******************************************************************************
//*  FUNC     :  从bytebuff中获取string 添加到链表中
//*  ARGS     :  p_st_data                   输入力数据
//*           :  p_st_boolean                boolean stream
//*           :  p_st_body_data                上报链表
//*           :  p_field_name                上报string的字段名
//*  RTN      :  FR_FAIL                     失败
//*           :  FR_SUCC                     false
//*  NOTE     :
//*******************************************************************************/
//int activeMQ_get_string(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean
//                    , Frreport_body_data *p_st_body_data, const char *p_field_name, int i_use_request)
//{
//    int i_ret = 0;
//
//    if(p_st_boolean)
//        i_ret = activeMQ_get_string1(p_st_data, p_st_boolean, p_st_body_data, p_field_name, i_use_request);
//    else
//        i_ret = activeMQ_get_string2(p_st_data, p_st_body_data, p_field_name, i_use_request);
//
//    return i_ret;
//
//}
/*
    跳过字符串
*/
int activeMQ_skip_string(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean)
{
    int i_ret = 0;
    unsigned short us_len = 0;

    if(p_st_data == NULL)
        return FR_FAIL;

    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret)
    {
        if(p_st_boolean)
        {
            i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
            if(i_ret < 0)
                return FR_FAIL;
        }
        i_ret = bytebuff_get_short(p_st_data, 2, &us_len, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        i_ret = bytebuff_skip(p_st_data, us_len);
        if(i_ret == FR_FAIL)
            return FR_FAIL;
    }

    return FR_SUCC;

}


/*******************************************************************************
*  FUNC     :  从bytebuff中获取string 添加到链表中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_boolean                boolean stream
*           :  p_st_body_data                上报链表
*           :  p_field_name                上报string的字段名
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_get_user(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean
                    , Frreport_body_data *p_st_body_data, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    char *p_field_value = NULL;
    unsigned short us_data_len = 0;

    if(p_st_data == NULL || p_st_body_data == NULL || p_st_private == NULL)
        return FR_FAIL;

    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret)
    {
        //取得长度
        i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        p_field_value = (char *)frmalloc(us_data_len + 1);
        if(p_field_value == NULL)
            return FR_FAIL;

        i_ret = bytebuff_get_bytes(p_st_data, p_field_value, us_data_len);
        if(i_ret == FR_FAIL)
        {
            frfree(p_field_value);
            return FR_FAIL;
        }
        p_field_value[us_data_len] = '\0';

        if(p_st_private->p_user_name)
            frfree(p_st_private->p_user_name);
        
        p_st_private->p_user_name = p_field_value;
    }

    return FR_SUCC;

}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取string 添加到链表中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_boolean                boolean stream
*           :  p_st_body_data                上报链表
*           :  p_field_name                上报string的字段名
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_get_pass(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean
                    , Frreport_body_data *p_st_body_data, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned short us_data_len = 0;

    if(p_st_data == NULL || p_st_body_data == NULL || p_st_private == NULL)
        return FR_FAIL;

    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret)
    {
        //取得长度
        i_ret = bytebuff_get_short(p_st_data, 2, &us_data_len, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        i_ret = bytebuff_skip(p_st_data, us_data_len);

        return i_ret;
    }

    return FR_SUCC;

}

///*******************************************************************************
//*  FUNC     :  从bytebuff中获取long 添加到链表中
//*  ARGS     :  p_st_data                   输入力数据
//*           :  p_st_body_data                上报链表
//*           :  p_field_name                上报string的字段名
//*  RTN      :  FR_FAIL                     失败
//*           :  FR_SUCC                     false
//*  NOTE     :
//*******************************************************************************/
//int activeMQ_get_int(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data
//                , const char *p_field_name, int i_use_request)
//{
//    int i_field_value = 0;
//    int i_ret = 0;
//    char arr_tmp[256];
//
//    if(p_st_data == NULL || p_st_body_data == NULL
//       || p_field_name == NULL)
//        return FR_FAIL;
//
//    i_ret = __activemq_fieldname_restruct(p_field_name, arr_tmp, sizeof(arr_tmp), i_use_request);
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;
//
//    //读取int
//    i_ret = bytebuff_get_int(p_st_data, 4, (uint32_t *)&i_field_value, BYTE_BIG_ENDIAN);
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;
//
//    //分配内存
//    i_ret = frreport_body_l7_add_int(p_st_body_data, arr_tmp, i_field_value);
//
//    return i_ret;
//
//}

int activeMQ_skip_int(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean)
{
    int i_ret = 0;

    if(p_st_data == NULL)
        return FR_FAIL;

    i_ret = bytebuff_skip(p_st_data, 4);
    return i_ret;
}


/*******************************************************************************
*  FUNC     :  从bytebuff中获取long 添加到链表中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_boolean                boolean stream
*           :  p_st_body_data                上报链表
*           :  p_field_name                上报string的字段名
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
FR_STATIC int activeMQ_get_time1(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean
                    , Frreport_body_data *p_st_body_data
                    , const char *p_field_name, int i_use_request, int is_topic, long long *p_l_time)
{
    long long ll_field_value = 0;
    int i_ret = 0;
    char arr_tmp[256];

    if(p_st_data == NULL || p_st_boolean == NULL
        || p_st_body_data == NULL || p_field_name == NULL)
        return FR_FAIL;

    i_ret = __activemq_fieldname_restruct(p_field_name, arr_tmp, sizeof(arr_tmp), i_use_request, is_topic);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //第一标志位
    i_ret = activeMQ_boolean_stream_parse1(p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret)
    {
        // 第二标志位
        i_ret = activeMQ_boolean_stream_parse1(p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_get_long(p_st_data, 8, (uint64_t *)&ll_field_value, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            i_ret = bytebuff_get_long(p_st_data, 4, (uint64_t *)&ll_field_value, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
    }
    else
    {
        //第二标志位
        i_ret = activeMQ_boolean_stream_parse1(p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_get_long(p_st_data, 2, (uint64_t *)&ll_field_value, BYTE_BIG_ENDIAN);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            return FR_SUCC;
        }
    }

    ll_field_value/=1000;

    //分配内存
    i_ret = frreport_body_l7_add_long(p_st_body_data, arr_tmp, ll_field_value);

    *p_l_time = ll_field_value;
    return i_ret;

}
/*******************************************************************************
*  FUNC     :  从bytebuff中获取long 添加到链表中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :  p_field_name                上报string的字段名
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
FR_STATIC int activeMQ_get_time2(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data
                    , const char *p_field_name, int i_use_request, int is_topic, long long *p_l_time)
{
    long long ll_field_value = 0;
    int i_ret = 0;
    char arr_tmp[256];

    if(p_st_data == NULL || p_st_body_data == NULL
        || p_field_name == NULL)
        return FR_FAIL;

    i_ret = __activemq_fieldname_restruct(p_field_name, arr_tmp, sizeof(arr_tmp), i_use_request, is_topic);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //long value
    i_ret = bytebuff_get_long(p_st_data, 8, (uint64_t *)&ll_field_value, BYTE_BIG_ENDIAN);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    ll_field_value /= 1000;

    //分配内存
    i_ret = frreport_body_l7_add_long(p_st_body_data, arr_tmp, ll_field_value);

    *p_l_time = ll_field_value;
    return i_ret;

}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取long 添加到链表中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_boolean                boolean stream
*           :  p_st_body_data                上报链表
*           :  p_field_name                上报string的字段名
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_get_time(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean
                    , Frreport_body_data *p_st_body_data
                    , const char *p_field_name, int i_use_request, int is_topic, long long *p_l_time)
{
    int i_ret = 0;

    if(p_st_boolean)
        i_ret = activeMQ_get_time1(p_st_data, p_st_boolean, p_st_body_data, p_field_name, i_use_request, is_topic, p_l_time);
    else
        i_ret = activeMQ_get_time2(p_st_data, p_st_body_data, p_field_name, i_use_request, is_topic, p_l_time);

    return i_ret;

}


int activeMQ_skip_long(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean)
{
    int i_ret = 0;

    if(p_st_data == NULL)
        return FR_FAIL;

    if(p_st_boolean)
    {
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            // 第二标志位
            i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
            if(i_ret < 0)
                return FR_FAIL;

            if(i_ret)
            {
                i_ret = bytebuff_skip(p_st_data, 8);
                if(i_ret == FR_FAIL)
                    return FR_FAIL;
            }
            else
            {
                i_ret = bytebuff_skip(p_st_data, 4);
                if(i_ret == FR_FAIL)
                    return FR_FAIL;
            }
        }
        else
        {
            i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
            if(i_ret < 0)
                return FR_FAIL;

            if(i_ret)
            {
                i_ret = bytebuff_skip(p_st_data, 2);
                if(i_ret == FR_FAIL)
                    return FR_FAIL;
            }
        }
    }
    else
    {
        i_ret = bytebuff_skip(p_st_data, 8);
        return i_ret;
    }

    return FR_SUCC;

}

///*******************************************************************************
//*  FUNC     :  从p_st_boolean中获取某一位的值 添加到链表中
//*  ARGS     :  p_st_boolean                boolean stream
//*           :  p_st_body_data                上报链表
//*           :  p_field_name                上报string的字段名
//*  RTN      :  FR_FAIL                     失败
//*           :  FR_SUCC                     false
//*  NOTE     :
//*******************************************************************************/
//FR_STATIC int activeMQ_get_boolean1(ACTIVEMQ_boolean *p_st_boolean, Frreport_body_data *p_st_body_data
//                    , const char *p_field_name, int i_use_request)
//{
//    int i_ret = 0;
//    char arr_tmp[256];
//
//    if(p_st_boolean == NULL || p_st_body_data == NULL || p_field_name == NULL)
//        return FR_FAIL;
//
//    i_ret = __activemq_fieldname_restruct(p_field_name, arr_tmp, sizeof(arr_tmp), i_use_request);
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;
//
//    //!= NULL
//    i_ret = activeMQ_boolean_stream_parse(NULL, p_st_boolean);
//    if(i_ret < 0)
//        return FR_FAIL;
//
//    //分配内存
//    if(i_ret)
//        i_ret = frreport_body_l7_add_int(p_st_body_data, arr_tmp, 1);
//    else
//        i_ret = frreport_body_l7_add_int(p_st_body_data, arr_tmp, 0);
//
//    return i_ret;
//
//}
//
///*******************************************************************************
//*  FUNC     :  从p_st_boolean中获取某一位的值 添加到链表中
//*  ARGS     :  p_st_boolean                boolean stream
//*           :  p_st_body_data                上报链表
//*           :  p_field_name                上报string的字段名
//*  RTN      :  FR_FAIL                     失败
//*           :  FR_SUCC                     false
//*  NOTE     :
//*******************************************************************************/
//FR_STATIC int activeMQ_get_boolean2(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data
//                    , const char *p_field_name, int i_use_request)
//{
//    int i_ret = 0;
//    char arr_tmp[256];
//
//    if(p_st_data == NULL || p_st_body_data == NULL || p_field_name == NULL)
//        return FR_FAIL;
//
//    i_ret = __activemq_fieldname_restruct(p_field_name, arr_tmp, sizeof(arr_tmp), i_use_request);
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;
//
//    //!= NULL
//    i_ret = activeMQ_boolean_stream_parse2(p_st_data);
//    if(i_ret < 0)
//        return FR_FAIL;
//
//    if(i_ret)
//        i_ret = frreport_body_l7_add_int(p_st_body_data, arr_tmp, 1);
//    else
//        i_ret = frreport_body_l7_add_int(p_st_body_data, arr_tmp, 0);
//
//    return i_ret;
//
//}
//
//
///*******************************************************************************
//*  FUNC     :  从p_st_boolean中获取某一位的值 添加到链表中
//*  ARGS     :  p_st_boolean                boolean stream
//*           :  p_st_body_data                上报链表
//*           :  p_field_name                上报string的字段名
//*  RTN      :  FR_FAIL                     失败
//*           :  FR_SUCC                     false
//*  NOTE     :
//*******************************************************************************/
//int activeMQ_get_boolean(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, Frreport_body_data *p_st_body_data
//                    , const char *p_field_name, int i_use_request)
//{
//    int i_ret = 0;
//
//    if(p_st_boolean)
//        i_ret = activeMQ_get_boolean1(p_st_boolean, p_st_body_data, p_field_name, i_use_request);
//    else
//        i_ret = activeMQ_get_boolean2(p_st_data, p_st_body_data, p_field_name, i_use_request);
//
//    return i_ret;
//
//}


int activeMQ_skip_boolean(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean)
{
    int i_ret = 0;

    if(p_st_data == NULL)
        return FR_FAIL;

    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    return FR_SUCC;

}

/*******************************************************************************
*  FUNC     :  从p_st_boolean 中获取 response_required 添加到链表中
*  ARGS     :  p_st_boolean                boolean stream
*           :  p_st_body_data                上报链表
*           :  p_field_name                上报string的字段名
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_response_required(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, Frreport_body_data *p_st_body_data, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;

    if(p_st_data == NULL || p_st_body_data == NULL || p_st_private == NULL)
        return FR_FAIL;

    //isResponseRequired
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(p_st_private->i_use_request)
    {
        p_st_private->i_flag_responserequired = i_ret;
        i_ret = frreport_body_l7_add_int(p_st_body_data, APM_REPORT_KEY_REQ_ISRESPREQUIRED, i_ret);
    }

    return FR_SUCC;

}

/*******************************************************************************
*  FUNC     :  从p_st_boolean中获取某一位的值 添加到链表中
*  ARGS     :  p_st_boolean                boolean stream
*           :  p_st_body_data                上报链表
*           :  p_field_name                上报string的字段名
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_get_byte(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data
                    , const char *p_field_name,int i_use_request, int is_topic)
{
    int i_ret = 0;
    int i_tmp = 0;
    char arr_tmp[256];

    if(p_st_data == NULL || p_st_body_data == NULL
        || p_field_name == NULL)
        return FR_FAIL;    

    i_ret = __activemq_fieldname_restruct(p_field_name, arr_tmp, sizeof(arr_tmp), i_use_request, is_topic);
    if(i_ret == FR_FAIL)
        return FR_FAIL;
        
    //byte 存储内存赋值
    i_ret = bytebuff_get_int(p_st_data, 1, (uint32_t *)&i_tmp, BYTE_BIG_ENDIAN);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    i_ret = frreport_body_l7_add_int(p_st_body_data, arr_tmp, i_tmp);

    return i_ret;

}

/*******************************************************************************
*  FUNC     :  从p_st_boolean中获取某一位的值 添加到链表中
*  ARGS     :  p_st_boolean                boolean stream
*           :  p_st_body_data                上报链表
*           :  p_field_name                上报string的字段名
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_skip_bytes(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean)
{
    int i_ret = 0;
    unsigned int ui_data_len = 0;

    if(p_st_data == NULL)
        return FR_FAIL;
        
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret == 0)
        return FR_SUCC;

    i_ret = bytebuff_get_int(p_st_data, 4, &ui_data_len, BYTE_BIG_ENDIAN);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //分配内存
    i_ret = bytebuff_skip(p_st_data, ui_data_len);

    return i_ret;

//    //get bytes
//    i_pos = bytebuff_getPosition(p_st_data);
//    i_ret = bytebuff_print(p_st_data, i_pos, ui_data_len, &p_field_value);
//    bytebuff_skip(p_st_data, ui_data_len);
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;
//
//    i_ret = frreport_body_l7_add_str(p_st_body_data, arr_tmp, p_field_value);
//
//    frfree(p_field_value);
//    return i_ret;

}


FR_STATIC int __msg_name_restruct(char *p_name, int i_len, L7session_activeMQ_private *p_st_private)
{
    if(p_name == NULL || p_st_private == NULL)
        return FR_FAIL;

    switch (p_st_private->i_message_type)
    {
        case 1:
//            if(p_st_private->is_topic)
//            {
//                if(p_st_private->i_use_request)
//                    snprintf(p_name, i_len, "%s", MQ_PUB_MSG_MAP);
//                else
//                    snprintf(p_name, i_len, "%s", MQ_NOTIFY_MSG_MAP);
//            }
//            else
//            {
//                if(p_st_private->i_use_request)
//                    snprintf(p_name, i_len, "%s", MQ_REQ_MSG_MAP);
//                else
//                    snprintf(p_name, i_len, "%s", MQ_RESP_MSG_MAP);
//            }
            return FR_SUCC;

        case 2:
            if(p_st_private->i_use_request)
                snprintf(p_name, i_len, "%s", MQ_REQ_MSG_TEXT);
            else
                snprintf(p_name, i_len, "%s", MQ_NOTIFY_MSG_TEXT);

            break;

        case 3:
            if(p_st_private->i_use_request)
                snprintf(p_name, i_len, "%s", MQ_REQ_MSG_BIN);
            else
                snprintf(p_name, i_len, "%s", MQ_NOTIFY_MSG_BIN);

            break;

        default:
            return FR_FAIL;
    }

    return FR_SUCC;

}

/*******************************************************************************
*  FUNC     :  从p_st_boolean中获取某一位的值 添加到链表中
*  ARGS     :  p_st_boolean                boolean stream
*           :  p_st_body_data                上报链表
*           :  p_field_name                上报string的字段名
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_get_mess(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, Frreport_body_data *p_st_body_data, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    char *p_field_value = NULL;
    unsigned int ui_data_len = 0;
    char arr_tmp[256];
    int i_map_size = 0;
    int i_len_limit = APM_REPORT_MQ_MAX;
    char *p_code_string = NULL;
    char *p_err_msg = NULL;

    if(p_st_data == NULL || p_st_body_data == NULL)
        return FR_FAIL;

    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret == 0)
        return FR_SUCC;

    i_ret = bytebuff_get_int(p_st_data, 4, &ui_data_len, BYTE_BIG_ENDIAN);
    if(i_ret == FR_FAIL || ui_data_len > p_st_data->ui_remaining)
        return FR_FAIL;

    if(p_st_private->i_use_request)
    {
        if(p_st_private->p_title)
        {
            if(p_st_private->is_topic)
                i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_REQ_TOPIC, p_st_private->p_title);
            else
                i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_REQ_QUE, p_st_private->p_title);

            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
    }
    else
    {
        if(p_st_private->p_title)
        {
            if(p_st_private->is_topic)
                i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_NOTIFY_TOPIC, p_st_private->p_title);
            else
                i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_NOTIFY_QUE, p_st_private->p_title);

            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }

        i_ret = frreport_body_l7_add_int(p_st_body_data, MQ_NOTIFY_MSG_SIZE, 1);
        if(i_ret == FR_FAIL)
            return FR_FAIL;
    }

    //map message
    if(p_st_private->i_message_type == 1)
    {
        i_ret = bytebuff_get_int(p_st_data, 4, (uint32_t *)&i_map_size, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        if(p_st_private->i_use_request)
        {
            i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_REQ_METHOD, "put");
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_REQ_MSG_TYPE, "hashmap");
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_NOTIFY_MSG_TYPE, "hashmap");
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }

        while(i_map_size--)
        {
            i_ret = __map_message_report(p_st_data, p_st_body_data, p_st_private, i_len_limit);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            if(i_len_limit < 0)
                return FR_SUCC;
        }

        return FR_SUCC;
    }

    if(p_st_private->i_message_type == 2)      //text message
    {

        if(p_st_private->i_use_request)
        {
            i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_REQ_METHOD, "put");
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_REQ_MSG_TYPE, "text");
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_NOTIFY_MSG_TYPE, "text");
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }

        //soap
        i_ret = bytebuff_get_int(p_st_data, 4, (uint32_t *)&ui_data_len, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        p_field_value = (char *)frmalloc(ui_data_len + 1);
        if(p_field_value == NULL)
            goto ERROR;

        i_ret = bytebuff_get_bytes(p_st_data, p_field_value, ui_data_len);
        if(i_ret == FR_FAIL)
            goto ERROR;

        p_field_value[ui_data_len] = '\0';

        i_ret = frxml_detect(p_field_value, ui_data_len);
        if(i_ret == FR_SUCC)
        {
            if(p_st_private->i_use_request)
                i_ret = frsoap_parse_req(p_field_value, ui_data_len, p_st_body_data);
            else
                i_ret = frsoap_parse_resp(p_field_value, ui_data_len, p_st_body_data, &p_code_string, &p_err_msg);

            if(i_ret == FR_FAIL)
                goto ERROR;

            if(p_code_string)
            {
                if(frreport_body_l7_add_int(p_st_body_data, APM_REPORT_KEY_RESP_CODE, 500) == FR_FAIL)
                    goto ERROR;

                if(frreport_body_l7_add_str(p_st_body_data, APM_REPORT_KEY_RESP_CODE_STRING, p_code_string) == FR_FAIL)
                    goto ERROR;
                frfree(p_code_string);
                p_code_string = NULL;

                if(frreport_body_l7_add_str(p_st_body_data, APM_REPORT_KEY_RESP_ERR_MSG, p_err_msg) == FR_FAIL)
                    goto ERROR;
                frfree(p_err_msg);
                p_err_msg = NULL;
            }
            else
            {
                if(frreport_body_l7_add_int(p_st_body_data, APM_REPORT_KEY_RESP_CODE, 0) == FR_FAIL)
                    goto ERROR;
            }
        }
        else
        {
            if(frreport_body_l7_add_int(p_st_body_data, APM_REPORT_KEY_RESP_CODE, 0) == FR_FAIL)
                goto ERROR;
        }

        i_ret = __msg_name_restruct(arr_tmp, sizeof(arr_tmp), p_st_private);
        if(i_ret == FR_FAIL)
            goto ERROR;

        i_ret = FRREPORT_BODY_L7_ADD_STR_LIMIT(p_st_body_data, arr_tmp, p_field_value);

        frfree(p_field_value);
        return i_ret;
    }

    if(p_st_private->i_message_type == 3) // stream message
    {
        if(p_st_private->i_use_request)
        {
            i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_REQ_METHOD, "put");
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_REQ_MSG_TYPE, "binary");
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            i_ret = frreport_body_l7_add_str(p_st_body_data, MQ_NOTIFY_MSG_TYPE, "binary");
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }

        i_ret = __msg_name_restruct(arr_tmp, sizeof(arr_tmp), p_st_private);
        if(i_ret == FR_FAIL)
            goto ERROR;

        p_field_value = (char *)frmalloc(ui_data_len);
        if(p_field_value == NULL)
            goto ERROR;

        i_ret = bytebuff_get_bytes(p_st_data, p_field_value, ui_data_len);
        if(i_ret == FR_FAIL)
            goto ERROR;

        i_ret = frreport_body_l7_add_bin(p_st_body_data, arr_tmp, p_field_value, ui_data_len);
        if(i_ret == FR_FAIL)
            goto ERROR;

        frfree(p_field_value);
        return FR_SUCC;
//        //消息过长情况处理
//        if(p_st_private->i_skip_len)
//        {
//            //数据包未完全跳过数据内容
//            if(p_st_data->ui_skip_len)
//                return FR_FAIL;
//            else
//            {
//                i_ret = bytebuff_skip(p_st_data, p_st_private->i_skip_len);
//                return i_ret;
//            }
//        }
//        else
//        {
//            if(p_st_data->ui_remaining < ui_data_len)
//            {
//                //数据包长度不够
//                i_skip_len = ui_data_len - p_st_data->ui_remaining;
//                i_ret = bytebuff_set_skip(p_st_data, i_skip_len);
//                if(i_ret == FR_FAIL)
//                    goto ERROR;
//
//                //已经存入的数据 待所有数据包接收结束的时候skip掉
//                p_st_private->i_skip_len = p_st_data->ui_remaining;
//                return FR_FAIL;
//            }
//            else
//            {
//                //同一个数据包已经收完数据块内容
//                i_ret = bytebuff_skip(p_st_data, ui_data_len);
//                p_st_private->i_skip_len = 0;
//                return i_ret;
//            }
//        }

    }

    return FR_FAIL;

ERROR:
    if(p_field_value)
        frfree(p_field_value);

    if(p_code_string)
        frfree(p_code_string);

    if(p_err_msg)
        frfree(p_err_msg);

    return FR_FAIL;

}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的command id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  pp_output                   输出数据内容
*           :  p_i_data_type               保存在Frdata_field 中的数据类型
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_get_command_id(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data)
{
    int i_ret = 0;

    if(p_st_data == NULL || p_st_body_data == NULL )
        return FR_FAIL;

    //获取command id
    i_ret = bytebuff_skip(p_st_data, 4);
//    i_ret = bytebuff_get_int(p_st_data, 4, (uint32_t *)&i_field_value, BYTE_BIG_ENDIAN);
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;

//    i_ret = frreport_body_l7_add_int(p_st_body_data, "activemq.commandid", i_field_value);

    return i_ret;

}


/*******************************************************************************
*  FUNC     :  从bytebuff中获取cache_index 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  pp_output                   输出数据内容
*           :  p_i_data_type               保存在Frdata_field 中的数据类型
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_get_cache_index(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, int i_tightEncodingEnabled)
{
    int i_ret = 0;

    if(p_st_data == NULL || p_st_body_data == NULL)
        return FR_FAIL;

    //获取cache
//    i_ret = bytebuff_get_int(p_st_data, 2, (uint32_t *)&i_field_value, BYTE_BIG_ENDIAN);
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;
//
//    i_ret = frreport_body_l7_add_int(p_st_body_data, "MARSHALL_CACHEMAP_INDEX", i_field_value);

    i_ret = bytebuff_skip(p_st_data, 2);

    return i_ret;

}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的broker_id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_broker_id(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL || p_st_private == NULL)
        return FR_FAIL;

    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = activeMQ_get_cache_index(p_st_data, p_st_body_data, p_st_private->i_tightEncodingEnabled);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            return FR_SUCC;
        }
    }

    //broker id != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //broker id == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x7c)
        return FR_FAIL;

    //value != null
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //设置出力参数


    return FR_SUCC;

}


/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的broker_id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_connection_id(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL || p_st_private == NULL)
        return FR_FAIL;

    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = activeMQ_get_cache_index(p_st_data, p_st_body_data, p_st_private->i_tightEncodingEnabled);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            return FR_SUCC;
        }
    }

    //object
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //connection id == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x78)
        return FR_FAIL;

    //value
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    return FR_SUCC;

}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的broker_id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int skip_connection_id(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_private == NULL)
        return FR_FAIL;

    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            return FR_SUCC;
        }
    }

    //object
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //connection id == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x78)
        return FR_FAIL;

    //value
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    return FR_SUCC;

}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的broker_id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_session_id(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL )
        return FR_FAIL;

    //i_index

    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = activeMQ_get_cache_index(p_st_data, p_st_body_data, p_st_private->i_tightEncodingEnabled);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            return FR_SUCC;
        }
    }

    //object != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //object == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x79)
        return FR_FAIL;

    //SESSION ID
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

//    i_ret = __get_session_info(p_st_data, p_st_boolean, p_st_body_data, &(p_st_private->p_sessionid));
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;

    //long value
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    return FR_SUCC;
}


/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的 consumer_id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_consumer_id(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL)
        return FR_FAIL;

    //i_index

    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = activeMQ_get_cache_index(p_st_data, p_st_body_data, p_st_private->i_tightEncodingEnabled);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            return FR_SUCC;
        }
    }

    //object != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //object == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x7a)
        return FR_FAIL;

    //CONNECTION ID
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //SESSION ID
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //LONG VALUE
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //设置出力参数
    

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的 consumer_id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int skip_consumer_id(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL)
        return FR_FAIL;

    //i_index
    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            return FR_SUCC;
        }
    }

    //object != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //object == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x7a)
        return FR_FAIL;

    //CONNECTION ID
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //SESSION ID
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //LONG VALUE
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //设置出力参数


    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的 destination 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_destination(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL )
        return FR_FAIL;

    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = activeMQ_get_cache_index(p_st_data, p_st_body_data, p_st_private->i_tightEncodingEnabled);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            
            return FR_SUCC;
        }
    }

    //object != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //object == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    if(uc_tmp != 0x64 && uc_tmp != 0x65 && uc_tmp != 0x66 && uc_tmp != 0x67)
        return FR_FAIL;

    if(uc_tmp == 0x65 || uc_tmp == 0x67)
        p_st_private->is_topic = 1;
    else
        p_st_private->is_topic = 0;

    // PhysicalName
    i_ret = __get_session_info(p_st_data, p_st_boolean, p_st_body_data, &(p_st_private->p_title));
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //设置出力参数

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的 destination 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int skip_destination(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL)
        return FR_FAIL;

    //i_index
    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            return FR_SUCC;
        }
    }

    //object != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //object == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    if(uc_tmp != 0x64 && uc_tmp != 0x65 && uc_tmp != 0x66 && uc_tmp != 0x67)
        return FR_FAIL;

    // PhysicalName
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    return FR_SUCC;
}


/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的 destination 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int skip_active_destination(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL)
        return FR_FAIL;

    // != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL
        || (uc_tmp != ACTIVEMQ_ACTIVEMQ_TEMP_QUEUE && uc_tmp != ACTIVEMQ_ACTIVEMQ_TEMP_TOPIC
            && uc_tmp != ACTIVEMQ_ACTIVEMQ_TOPIC && uc_tmp != ACTIVEMQ_ACTIVEMQ_QUEUE)
        )
        return FR_FAIL;

    // PhysicalName
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的 activemq_destination 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_activemq_destination(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL )
        return FR_FAIL;

    //i_index
    

    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = activeMQ_get_cache_index(p_st_data, p_st_body_data, p_st_private->i_tightEncodingEnabled);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            
            return FR_SUCC;
        }
    }

    //object != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //object == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x08)
        return FR_FAIL;

    // PhysicalName
    i_ret = __get_session_info(p_st_data, p_st_boolean, p_st_body_data, &(p_st_private->p_title));
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //设置出力参数
    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  从bytebuff中获取object的 activemq_destination 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_original_destination(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL )
        return FR_FAIL;

    //i_index
    

    //index == NULL 后移两个字节
    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = activeMQ_get_cache_index(p_st_data, p_st_body_data, p_st_private->i_tightEncodingEnabled);
            if(i_ret == FR_FAIL)
                return FR_FAIL;


            return FR_SUCC;
        }
    }

    //object != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //object == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x08)
        return FR_FAIL;

    // PhysicalName
    i_ret = __get_session_info(p_st_data, p_st_boolean, p_st_body_data, &(p_st_private->p_title));
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //设置出力参数
    

    return FR_SUCC;
}
/*******************************************************************************
*  FUNC     :  producer_id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int skip_producer_id(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL)
        return FR_FAIL;

    //index == NULL 后移两个字节
    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            return FR_SUCC;
        }
    }

    //object != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //object == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x7b)
        return FR_FAIL;

    //CONNECTION ID
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //LONG VALUE
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //SESSION ID
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //设置出力参数
    return FR_SUCC;
}


/*******************************************************************************
*  FUNC     :  local transaction_id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_local_transaction_id(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL )
        return FR_FAIL;

    //i_index
    

    //index == NULL 后移两个字节
    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = activeMQ_get_cache_index(p_st_data, p_st_body_data, p_st_private->i_tightEncodingEnabled);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            
            return FR_SUCC;
        }
    }

    //object != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //object == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != 0x6f)
        return FR_FAIL;

    //LONG VALUE
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //CONNECTION ID
    i_ret = get_connection_id(p_st_data, p_st_body_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //设置出力参数
    

    return FR_SUCC;
}


/*******************************************************************************
*  FUNC     :  local transaction_id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int skip_transaction_id(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL)
        return FR_FAIL;

    //i_index

    //index == NULL 后移两个字节
    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;


            return FR_SUCC;
        }
    }

    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret == 0)
        return FR_SUCC;

    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    if(uc_tmp != 0x6f && uc_tmp != 0x70)
        return FR_FAIL;

    if(uc_tmp == 0x6f)
    {
        //LocalTransactionId
        i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        //ConnectionId
        i_ret = skip_connection_id(p_st_data, p_st_boolean, p_st_private);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

    }
    else
    {
        //FormatId
        i_ret = activeMQ_skip_int(p_st_data, p_st_boolean);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        //GlobalTransactionId
        i_ret = activeMQ_skip_bytes(p_st_data, p_st_boolean);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        //BranchQualifier
        i_ret = activeMQ_skip_bytes(p_st_data, p_st_boolean);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

    }

    //设置出力参数
    return FR_SUCC;
}


/*******************************************************************************
*  FUNC     :  local object id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_object_id(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL )
        return FR_FAIL;

    //i_index
    

    //index == NULL 后移两个字节
    if(p_st_private->i_cacheEnabled)
    {
        //cache index == null   数据解析时无关
        i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
        if(i_ret < 0)
            return FR_FAIL;

        if(i_ret)
        {
            i_ret = bytebuff_skip(p_st_data, 2);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
        else
        {
            //tight marshal
            i_ret = activeMQ_get_cache_index(p_st_data, p_st_body_data, p_st_private->i_tightEncodingEnabled);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            
            return FR_SUCC;
        }
    }
    //object
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    //connection id == null
    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    switch(uc_tmp)
    {
        case ACTIVEMQ_CONNECTION_ID:
            //value
            i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
            break;

        case ACTIVEMQ_SESSION_ID:
            //SESSION ID
            i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            //long value
            i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            break;

        case ACTIVEMQ_CONSUMER_ID:
            //CONNECTION ID
            i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            //SESSION ID
            i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            //LONG VALUE
            i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
            break;

        case ACTIVEMQ_PRODUCER_ID:
            //CONNECTION ID
            i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            //LONG VALUE
            i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            //SESSION ID
            i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
            break;

        default:
            return FR_FAIL;
    }

    //设置出力参数
    

    return FR_SUCC;

}


/*******************************************************************************
*  FUNC     :  local object id 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_data_structure(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL || p_st_body_data == NULL )
        return FR_FAIL;

    //i_index
    

    //object != null   数据解析时无关
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    switch(uc_tmp)
    {
        //todo
    }

    return FR_SUCC;

}

/*******************************************************************************
*  FUNC     :  message 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int get_activemq_message(Frbyte_Packet *p_st_data, Frreport_body_data *p_st_body_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    short s_path_size = 0;
    long long ll_time_in = 0, ll_time_out = 0;
    char arr_tmp[256];

    if(p_st_data == NULL || p_st_body_data == NULL )
        return FR_FAIL;
    
    //command id
    i_ret = activeMQ_get_command_id(p_st_data, p_st_body_data);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //isResponseRequired
    i_ret = activeMQ_skip_boolean(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //ProducerId
    i_ret = skip_producer_id(p_st_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //Destination
    i_ret = get_destination(p_st_data, p_st_body_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

//    //TransactionId
    i_ret = skip_transaction_id(p_st_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //OriginalDestination
    i_ret = get_destination(p_st_data, p_st_body_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //MessageId
    i_ret = skip_message_id(p_st_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //OriginalTransactionId
    i_ret = skip_transaction_id(p_st_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //GroupID
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //GroupSequence
    i_ret = activeMQ_skip_int(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //CorrelationId
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //isPersistent
    i_ret = activeMQ_skip_boolean(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //Expiration
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //Priority
    i_ret = activeMQ_get_byte(p_st_data, p_st_body_data, "priority", p_st_private->i_use_request, p_st_private->is_topic);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //ReplyTo
    i_ret = skip_active_destination(p_st_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

//    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;


    //Timestamp
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //Type
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

//    i_ret = bytebuff_peek_int(p_st_data, 4, (uint32_t *)&ui_mess_len, BYTE_BIG_ENDIAN);
//    if(i_ret == FR_FAIL)
//        return FR_FAIL;

    //Content Token
    i_ret = activeMQ_get_mess(p_st_data, p_st_boolean, p_st_body_data, p_st_private);
//    i_ret = activeMQ_get_string(p_st_data, p_st_boolean, p_st_body_data, "Token", p_st_private->i_use_request);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //marshalledProperties
    i_ret = activeMQ_skip_bytes(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //DataStructure
    i_ret = get_data_structure(p_st_data, p_st_body_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //TargetConsumerId
    i_ret = skip_consumer_id(p_st_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //isCompressed
    i_ret = activeMQ_skip_boolean(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //RedeliveryCounter
    i_ret = activeMQ_skip_int(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //BrokerPath  brokerid
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret)
    {
        i_ret = bytebuff_get_short(p_st_data, 2, (uint16_t *)&s_path_size, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
            return FR_FAIL;
        //获取broker id  tightmarshal
        while(s_path_size)
        {
            i_ret = get_broker_id(p_st_data, p_st_body_data, p_st_boolean, p_st_private);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
    }

    //Arrival
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //UserID
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //isRecievedByDFBridge
    i_ret = activeMQ_skip_boolean(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //isDroppable
    i_ret = activeMQ_skip_boolean(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //Cluster  brokerid
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret)
    {
        i_ret = bytebuff_get_short(p_st_data, 2, (uint16_t *)&s_path_size, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
            return FR_FAIL;
        //获取broker id  tightmarshal
        while(s_path_size)
        {
            i_ret = get_broker_id(p_st_data, p_st_body_data, p_st_boolean, p_st_private);
            if(i_ret == FR_FAIL)
                return FR_FAIL;
        }
    }
    //BrokerInTime
    i_ret = activeMQ_get_time(p_st_data, p_st_boolean, p_st_body_data, "in_timestamp", p_st_private->i_use_request, p_st_private->is_topic, &ll_time_in);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //BrokerOutTime
    i_ret = activeMQ_get_time(p_st_data, p_st_boolean, p_st_body_data, "out_timestamp", p_st_private->i_use_request, p_st_private->is_topic, &ll_time_out);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    if(ll_time_in && ll_time_out)
    {
        i_ret = __activemq_fieldname_restruct("qtime_us", arr_tmp, sizeof(arr_tmp), p_st_private->i_use_request, p_st_private->is_topic);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        i_ret = frreport_body_l7_add_long(p_st_body_data, arr_tmp, ll_time_out - ll_time_in);
        if(i_ret == FR_FAIL)
            return FR_FAIL;
    }

    if(p_st_private->i_openwire_version == 10)
    {
        //isACTIVEMQXGroupFirstForConsumer
        i_ret = activeMQ_skip_boolean(p_st_data, p_st_boolean);
        if(i_ret == FR_FAIL)
            return FR_FAIL;
    }

    return FR_SUCC;
}


/*******************************************************************************
*  FUNC     :  message 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int skip_message_id(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean, L7session_activeMQ_private *p_st_private)
{
    int i_ret = 0;
    unsigned char uc_tmp;

    if(p_st_data == NULL)
        return FR_FAIL;

    // != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret == 0)
        return FR_SUCC;

    //type
    i_ret = bytebuff_get_char(p_st_data, (uint8_t *)&uc_tmp);
    if(i_ret == FR_FAIL || uc_tmp != ACTIVEMQ_MESSAGE_ID)
        return FR_FAIL;

    //TextView
    if(p_st_private->i_openwire_version == 10)
    {
        i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
        if(i_ret == FR_FAIL)
            return FR_FAIL;
    }

    //producer id
    i_ret = skip_producer_id(p_st_data, p_st_boolean, p_st_private);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //ProducerSequenceId
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //BrokerSequenceId
    i_ret = activeMQ_skip_long(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;


    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  message 添加到链表当中
*  ARGS     :  p_st_data                   输入力数据
*           :  p_st_body_data                上报链表
*           :                     节点的索引号
*           :  i_tightEncodingEnabled         数据是否用tightmarshal（FR_YES   FR_NO）
*  RTN      :  FR_FAIL                     失败
*           :  FR_SUCC                     false
*  NOTE     :
*******************************************************************************/
int activeMQ_skip_throwable(Frbyte_Packet *p_st_data, ACTIVEMQ_boolean *p_st_boolean
                            , L7session_activeMQ_private *p_st_private, int i_flag_stacktraceEnabled)
{
    int i_ret = 0;
    unsigned short us_stacktrace_len = 0;

    if(p_st_data == NULL)
        return FR_FAIL;

    // != NULL
    i_ret = activeMQ_boolean_stream_parse(p_st_data, p_st_boolean);
    if(i_ret < 0)
        return FR_FAIL;

    if(i_ret == 0)
        return FR_SUCC;

    //ClassName
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;

    //Message
    i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
    if(i_ret == FR_FAIL)
        return FR_FAIL;
    //wireFormat.isStackTraceEnabled
    if(i_flag_stacktraceEnabled)
    {
        //us_stacktrace_len
        i_ret = bytebuff_get_short(p_st_data, 2, &us_stacktrace_len, BYTE_BIG_ENDIAN);
        if(i_ret == FR_FAIL)
            return FR_FAIL;

        while(us_stacktrace_len != 0)
        {
            //elementClassName
            i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            //elementMethodName
            i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            //elementFileName
            i_ret = activeMQ_skip_string(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

            //elementLineNumber
            i_ret = activeMQ_skip_int(p_st_data, p_st_boolean);
            if(i_ret == FR_FAIL)
                return FR_FAIL;

        }

        i_ret = activeMQ_skip_throwable(p_st_data, p_st_boolean, p_st_private, i_flag_stacktraceEnabled);
    }
    return i_ret;

}

